#-*- coding: utf-8 -*-

def creer_matrice(n_taches, contraintes):
    mat = [[False] * n_taches for x in range(n_taches)]
    for c in contraintes:
        i, j = c
        mat[i][j] = True
    return mat

def joli_print(mat):
    for l in mat:
        print l
    print "--"

def ordonnanceur(mat):
    data = mat[:] #copie
    for i, r in enumerate(data):
        data[i] = [i] + r
    modif = True #faut que ça boucle au moins une fois
    while modif:
        print u"itération"
        joli_print(data)
        modif = False
        #chaque ligne
        for i in range(len(data)):
            #chaque colonne
            for j in range(1, len(data)+1):
                if data[i][j] == True:
                    print u"tâches", i, "et", j-1, data[i][j]
                    #on cherche les indices associés à i et j
                    prem = -1 #pas encore trouvé
                    secd = -1 #pas encore trouvé
                    for k in range(len(data)):
                        if data[k][0] == j-1:
                            print u"trouvé prem", k
                            prem = k
                        if data[k][0] == i:
                            print u"trouvé secd", k
                            secd = k
                        if prem != -1:
                            if secd == -1:
                                print u"ordre déjà ok"
                                break #déjà dans l'ordre !
                            else:
                                print "faut inverser", prem, "et", secd
                                #swap
                                tmp = data[prem][:] #copie
                                data[prem] = data[secd][:] #copie
                                data[secd] = tmp
                                #dbg
                                print u"après inversion"
                                joli_print(data)
                                #on boucle à nouveau
                                modif = True
                                break
    return [x[0] for x in data]






mat = creer_matrice(4, [(2, 0), (2, 1), (0, 1), (3, 2)])
res = ordonnanceur(mat)
print u"résultat", res
